package com.wy.controller;

import com.wy.dao.ClazzDao;
import com.wy.dao.StudentDao;
import com.wy.pojo.Student;
import com.wy.utils.UploadResult;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
@RequestMapping("/upload")
public class UploadController {

    @Autowired
    private StudentDao studentDao;
    @Autowired
    private ClazzDao clazzDao;

    /**
     * 处理本地文件上传
     * @param req HttpServletRequest
     * @param dirName 文件夹名称
     * @return 文件路径和文件名的Map
     */
    private Map<String, String> myUpload(HttpServletRequest req, String dirName) {
        String resPath = null;
        String fileName = null;
        try {
            // 获取web服务器项目的真实物理路径加上dirName的文件夹
            String localDir = req.getSession().getServletContext().getRealPath(dirName);

            // 如果目录不存在，则创建目录
            File resDirFile = new File(localDir);
            if (!resDirFile.exists()) {
                boolean flag = resDirFile.mkdirs();
                if (!flag) throw new RuntimeException("创建目录失败");
            }

            // 判断上传的数据是否是多部分数据（只有多段数据才是文件上传）
            if (ServletFileUpload.isMultipartContent(req)) {
                // 创建 FileItemFactory 工厂实现类
                FileItemFactory fileItemFactory = new DiskFileItemFactory();
                // 创建用于解析上传数据的工具类 ServletFileUpload 类
                ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
                // 解析上传的数据，得到每一个表单项 FileItem
                List<FileItem> list = servletFileUpload.parseRequest(req);

                // 循环判断每一个表单项，判断是普通类型还是上传的文件
                for (FileItem fileItem : list) {
                    if (!fileItem.isFormField()) {  // 是上传的文件
                        // 获取上传的文件名
                        System.out.println("上传的文件名：" + fileItem.getName());
                        fileName = fileItem.getName();

                        if (fileName != null && !fileName.isEmpty()) {
                            // 防止文件名重复，加上时间戳
                            String newFileName = System.currentTimeMillis() + "_" + fileName;
                            resPath = dirName + "/" + newFileName;
                            // 保存文件到指定目录
                            fileItem.write(new File(localDir + "/" + newFileName));
                        }
                    }
                }
            } else {
                System.out.println("请求不是文件上传请求！");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 返回文件路径和文件名
        Map<String, String> resMap = new HashMap<>();
        resMap.put("resPath", resPath);
        resMap.put("fileName", fileName);
        return resMap;
    }

    /**
     * 上传附件
     * @param req HttpServletRequest
     * @return 上传结果
     */
    @ResponseBody
    @RequestMapping({"uploadAttachment.do", "student/uploadAttachment.do"})
    public UploadResult uploadAttachment(HttpServletRequest req) {
        try {
            req.setCharacterEncoding("UTF-8"); // 设置请求编码

            if (ServletFileUpload.isMultipartContent(req)) {
                Map<String, String> map = myUpload(req, "attachment");
                String resPath = map.get("resPath");
                String fileName = map.get("fileName");
                return UploadResult.success(resPath, fileName);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return UploadResult.fail("非文件上传请求");
    }

    /**
     * 上传文章
     * @param req HttpServletRequest
     * @return 上传结果
     */
    @RequestMapping("uploadArticle.do")
    public UploadResult uploadArticle(HttpServletRequest req) {
        try {
            req.setCharacterEncoding("UTF-8"); // 设置请求编码

            if (ServletFileUpload.isMultipartContent(req)) {
                Map<String, String> map = myUpload(req, "article");
                String resPath = map.get("resPath");
                String fileName = map.get("fileName");
                return UploadResult.success(resPath, fileName);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return UploadResult.fail("非文件上传请求");
    }

    @PostMapping("/excel.do")
    public String uploadExcel(@RequestParam("excelFile") MultipartFile file) {
        if (file.isEmpty()) {
            return "文件不能为空！";
        }

        try {
            // 获取文件流
            InputStream inputStream = file.getInputStream();

            // 根据文件后缀名决定是 .xlsx 还是 .xls
            Workbook workbook = null;
            if (file.getOriginalFilename().endsWith("xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else if (file.getOriginalFilename().endsWith("xls")) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                return "文件类型不支持，仅支持 Excel 文件！";
            }

            // 读取 Excel 表单内容
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个表单
            Iterator<Row> rows = sheet.iterator(); // 获取所有行

            // 跳过表头（第一行），从第二行开始读取数据
            rows.next(); // 跳过表头

            while (rows.hasNext()) {
                Row row = rows.next();

                // 获取 Excel 中的每列数据
                String serialNumber = getCellValue(row.getCell(0));  // 序号，第一列
                String name = getCellValue(row.getCell(1));  // 姓名
                String studentIdStr = getCellValue(row.getCell(2));  // 学号
                String gender = getCellValue(row.getCell(3));  // 性别

                String ageStr = getCellValue(row.getCell(4));  // 年龄
                Integer age = null;
                if (!ageStr.isEmpty()) {
                    try {
                        age = Integer.valueOf(ageStr);
                    } catch (NumberFormatException e) {
                        return "年龄格式错误，无法转换为数字： " + ageStr;
                    }
                }

                String className = getCellValue(row.getCell(5));  // 所属班级
                String status = getCellValue(row.getCell(6));  // 状态
                String remark = getCellValue(row.getCell(7));  // 备注
                // 确保读取为字符串
                String idCard = getCellValue(row.getCell(8));  // 身份证号
                String phoneNumber = getCellValue(row.getCell(9));  // 手机号
                String address = getCellValue(row.getCell(10));  // 家庭住址
                String enrollmentDateStr = getCellValue(row.getCell(11));  // 入校时间
                String password = getCellValue(row.getCell(12));  // 密码
                String photo = getCellValue(row.getCell(13));  // 照片（路径或URL）

                // 根据班级名称查询班级 ID
                Integer classId = clazzDao.getClassIdByName(className);  // 通过数据库查询班级 ID

                // 如果班级 ID 为 null，说明班级名称无效
                if (classId == null) {
                    return "班级名称 " + className + " 无效";
                }

                // 创建 Student 实体对象
                Student student = new Student();
                student.setSname(name);
                student.setSnum(studentIdStr);  // 学号保存为 String
                student.setSsex(gender);
                student.setSage(age);  // 设置年龄
                student.setCid(classId);  // 设置班级 ID
                student.setSstatus(status);
                student.setSremark(remark);
                student.setIdcard(idCard);  // 身份证号
                student.setPhone(phoneNumber);  // 手机号
                student.setAddress(address);  // 家庭住址
                student.setEntime(enrollmentDateStr);  // 入校时间
                student.setPswd(password);  // 密码
                student.setPic(photo);  // 照片（路径或URL）

                // 将学生信息保存到数据库
                studentDao.insertStudent(student);  // 如果使用 MyBatis
            }
            workbook.close();
            String responseMessage = "学生信息导入成功！";
            System.out.println("返回的响应消息: " + responseMessage);  // 打印日志
            return responseMessage;
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败：" + e.getMessage();
        }
    }

    // 提取单元格内容并返回合适的数据类型
    public String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 如果是日期类型
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                    return dateFormat.format(date);
                } else {
                    // 否则返回数字
                    double numericValue = cell.getNumericCellValue();
                    return String.valueOf((long) numericValue);  // 转换为 long 类型再转为字符串
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            default:
                return "";
        }
    }
}
